package com.future.common.util.date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;

/**
 * 日期工具类
 *
 * @author shiyong
 * 2020/12/14 9:08
 */
public class DateUtils {

    public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 获取当前时间（包含时分秒）
     *
     * @return java.time.LocalDateTime
     * @author shiyong
     * 2020/12/14 10:04
    */
    public static LocalDateTime getLocalDateTime() {
        return LocalDateTime.now();
    }

    /**
     * 转换时间字符串
     *
     * @param dateTime 时间字符串（包含时分秒，字符串格式：yyyy-MM-dd HH:mm:ss）
     * @return java.time.LocalDateTime
     * @author shiyong
     * 2020/12/14 10:19
    */
    public static LocalDateTime getLocalDateTime(String dateTime) {
        return LocalDateTime.parse(dateTime, DATE_TIME_FORMATTER);
    }

    /**
     * 转换时间字符串
     *
     * @param dateTime 时间字符串（包含时分秒）
     * @param dateTimeFormatter 时间格式模板
     * @return java.time.LocalDateTime
     * @author shiyong
     * 2020/12/14 10:29
    */
    public static LocalDateTime getLocalDateTime(String dateTime, DateTimeFormatter dateTimeFormatter) {
        return LocalDateTime.parse(dateTime, dateTimeFormatter);
    }

    /**
     * 根据时间戳获取时间
     *
     * @param timeStamp 时间戳
     * @return java.time.LocalDateTime
     * @author shiyong
     * 2020/12/14 10:43
    */
    public static LocalDateTime getLocalDateTime(long timeStamp) {
        // 时间戳转Instant，再由Instant转LocalDateTime
        Instant instant = Instant.ofEpochMilli(timeStamp);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 转换Date日期为LocalDateTime
     *
     * @param date 日期
     * @return java.time.LocalDateTime
     * @author shiyong
     * 2020/12/14 16:26
    */
    public static LocalDateTime getLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 获取当前时间（不包含时分秒）
     *
     * @return java.time.LocalDate
     * @author shiyong
     * 2020/12/14 10:17
    */
    public static LocalDate getLocalDate() {
        return LocalDate.now();
    }

    /**
     * 转换日期字符串
     *
     * @param date 日期字符串（不包含时分秒）
     * @return java.time.LocalDate
     * @author shiyong
     * 2020/12/14 10:55
    */
    public static LocalDate getLocalDate(String date) {
        return LocalDate.parse(date, DATE_FORMATTER);
    }

    /**
     * 转换日期字符串
     *
     * @param date 日期字符串（不包含时分秒）
     * @param dateTimeFormatter 日期格式模板
     * @return java.time.LocalDate
     * @author shiyong
     * 2020/12/14 10:56
    */
    public static LocalDate getLocalDate(String date, DateTimeFormatter dateTimeFormatter) {
        return LocalDate.parse(date, dateTimeFormatter);
    }

    /**
     * 转换Date日期为LocalDate
     *
     * @param date 日期
     * @return java.time.LocalDate
     * @author shiyong
     * 2020/12/14 16:35
    */
    public static LocalDate getLocalDate(Date date) {
        // 先转成Instant，再由Instant转换为LocalDate
        return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDate();
    }

    /**
     * 获取时间戳（时间戳：从1970-01-01零点到当前的毫秒数）
     *
     * @return long
     * @author shiyong
     * 2020/12/14 9:27
    */
    public static long getTimeStamp() {
        return Instant.now().toEpochMilli();
    }

    /**
     * 获取指定时间的时间戳
     *
     * @param localDateTime 时间
     * @return long
     * @author shiyong
     * 2020/12/14 9:56
    */
    public static long getTimeStamp(LocalDateTime localDateTime) {
        Objects.requireNonNull(localDateTime, "localDateTime is null");
        // LocalDateTime转Instant，再由Instant获取时间戳
        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    /**
     * 转换LocalDateTime日期为Date
     *
     * @param localDateTime LocalDateTime日期
     * @return java.util.Date
     * @author shiyong
     * 2020/12/14 16:59
    */
    public static Date getDate(LocalDateTime localDateTime) {
        // 先转换为Instant，再由Instant转换为Date
        return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
    }

    /**
     * 获取时间字符串（字符串格式：yyyy-MM-dd HH:mm:ss）
     *
     * @param localDateTime 时间（包含时分秒）
     * @return java.lang.String
     * @author shiyong
     * 2020/12/14 18:05
    */
    public static String getStringOfLocalDateTime(LocalDateTime localDateTime) {
        return localDateTime.format(DATE_TIME_FORMATTER);
    }

    /**
     * 获取时间字符串
     *
     * @param localDateTime 时间（包含时分秒）
     * @param dateTimeFormatter 字符串格式
     * @return java.lang.String
     * @author shiyong
     * 2020/12/14 18:08
    */
    public static String getStringOfLocalDateTime(LocalDateTime localDateTime, DateTimeFormatter dateTimeFormatter) {
        return localDateTime.format(dateTimeFormatter);
    }

    /**
     * 获取日期字符串（字符串格式：yyyy-MM-dd）
     *
     * @param localDate 日期（不包含时分秒）
     * @return java.lang.String
     * @author shiyong
     * 2020/12/14 18:10
    */
    public static String getStringOfLocalDate(LocalDate localDate) {
        return localDate.format(DATE_FORMATTER);
    }

    /**
     * 获取日期字符串
     *
     * @param localDate 日期（不包含时分秒）
     * @param dateTimeFormatter 字符串格式
     * @return java.lang.String
     * @author shiyong
     * 2020/12/14 18:11
    */
    public static String getStringOfLocalDate(LocalDate localDate, DateTimeFormatter dateTimeFormatter) {
        return localDate.format(dateTimeFormatter);
    }
}
